<!DOCTYPE html>
<title>SpeechSynthesisUtterance voice attribute</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
test(() => {
  const u = new SpeechSynthesisUtterance();
  assert_equals(u.voice, null);
}, 'initial state');

test(() => {
  const u = new SpeechSynthesisUtterance();
  u.voice = null;
  assert_equals(u.voice, null);
  u.voice = undefined;
  assert_equals(u.voice, null);
}, 'setting to null/undefined');

test(() => {
  const u = new SpeechSynthesisUtterance();
  for (const value of [{}, "", window]) {
    assert_throws_js(TypeError, () => { u.voice = value; } );
    assert_equals(u.voice, null);
  }
}, 'setting to non-SpeechSynthesisVoice values');

async_test((test) => {
  internals.enableMockSpeechSynthesizer(window);
  speechSynthesis.onvoiceschanged = function() {
    const u = new SpeechSynthesisUtterance();
    const voice = speechSynthesis.getVoices()[0];
    // TODO(foolip): This should test instanceof SpeechSynthesisVoice when that
    // interface is exposed.
    assert_equals(typeof voice, "object");
    u.voice = voice;
    assert_equals(u.voice, voice);
    test.done();
  };
}, 'setting to SpeechSynthesisVoice');
</script>
